package com.byd.fastevent;

import java.util.LinkedList;

public class FastEventSender<T> {
	private LinkedList<FastEventReciever<T>> mRecievers;
	private Object[] mTemps;
	private boolean mDestroy;

	public FastEventSender() {
		mRecievers = new LinkedList<FastEventReciever<T>>();
	}

	/** 注册事件接收器 */
	public synchronized void registerReceiver(FastEventReciever<T> reciver) {
		if(!mDestroy && reciver != null) {
			reciver.attach(this);
			mRecievers.add(reciver);
			mTemps = mRecievers.toArray();
		}
	}

	/** 发送事件 */
	@SuppressWarnings("unchecked")
	public synchronized void send(T t) {
		if(!mDestroy && mTemps != null) {
			for (final Object reciever : mTemps) {
				if(reciever == null) {
					break;
				}
				((FastEventReciever<T>) reciever).send(t);
			}
		}
	}

	/** 事件接收器是否在接收 */
	public boolean isInReceive(FastEventReciever<T> reciever) {
		return !mDestroy && mRecievers != null && mRecievers.contains(reciever);
	}

	/** 销毁事件发送 */
	public synchronized void destroy() {
		if(!mDestroy) {
			mDestroy = true;
			for (final FastEventReciever<T> reciever : mRecievers) {
				reciever.unregisterReceiver();
			}
			mRecievers.clear();
			mRecievers = null;
		}
	}

	synchronized void unRecieve(FastEventReciever<? super T> reciver) {
		if(!mDestroy && reciver != null) {
			mRecievers.remove(reciver);
			mTemps = mRecievers.toArray();
		}
	}
}
